package com.example.collection

import org.junit.Test


/**
 * 测试集合List
 * List是不可变集合
 * mutableList是可变集合
 *
 * @author zhouronghua
 * @time 2022/3/24 10:12 下午
 */
class ListTest {

    /**
     * List是不可变集合，不能修改列表数据.
     * 不能添加元素、删除元素、修改元素数据
     */
    @Test
    fun testList() {
        val list = listOf("Derry", "Joe", "小明", "丽丽")
        println(list[0])
        // 规避下表越界异常
        println(list.getOrElse(10) { "越界了" })
        // 越界返回null
        println(list.getOrNull(10) ?: "数组已经越界了")

        // 可变列表，支持列表元素增删改查
        var mlist: MutableList<String>? = null
        println(ListUtils.getSize(mlist))
        mlist = mutableListOf()
//        mlist.add("aaaaa")
        println(ListUtils.getSize(mlist))
        println(ListUtils.checkList(mlist, 0))
        println(ListUtils.checkList(mlist, 1))
        println(ListUtils.checkList(mlist, 2))
        // 将不可变集合变为可变List
        val list3 = list.toMutableList()
        list3.add("新元素")
        list3 += "小明王"
        println(list3)
    }

    /**
     * mutableList是可变集合，可以修改列表中数据
     *
     */
    @Test
    fun testMutableList() {
        val list = mutableListOf("Derry", "Joe", "小明", "丽丽")
        list.add(0, "天天")
        println(list[0])

        val price = 1132
        println("${price / 100}")
    }

    @Test
    fun testList2MutableList() {
        val list = listOf("Derry", "Joe", "小明", "丽丽")
        println(list[0])
        println("===转换为可变集合==")
        val mutableList = list.toMutableList()
        // 添加新元素
        mutableList.add("小包子")
        println(mutableList)
        println("删除元素后集合")
        // 删除元素存在越界
//        mutableList.removeAt(10)
        // 带条件的删除
        mutableList.removeIf {
            it == "Joe"
        }
        println(mutableList)
        println("===转换为不可变集合==")
        val list2 = mutableList.toList()
        println(list2)
    }

    /**
     * 列表遍历forEach/forEachIndexed
     *
     *
     */
    @Test
    fun testListIterator() {
        println("==遍历列表元素==")
        val list = listOf("Derry", "Joe", "小明", "丽丽")
        list.forEach {
            println(it)
        }
        println("==带下标遍历列表元素==")
        // forEachIndexed第一个内置参数为index，第二个参数为item项
        list.forEachIndexed { index, item ->
            println("第 $index 元素$item")
        }
    }

    /**
     * List解构
     *
     * 反编译后的代码：
     * List list = CollectionsKt.listOf(new String[]{"Derry", "Joe", "小明", "丽丽"});
     * String item1 = (String)list.get(0);
     * String item2 = (String)list.get(1);
     * String item3 = (String)list.get(2);
     * String item4 = (String)list.get(3);
     * String item5 = (String)list.get(4);
     */
    @Test
    fun testListUnstructure() {
        println("==列表解构==")
        // 解构元素的时候，如果解构的参数大于列表元素个数，会抛出异常java.lang.ArrayIndexOutOfBoundsException
        val list = listOf("Derry", "Joe", "小明", "丽丽")
        // 结构时超出列表元素会发生崩溃
        val (item1, item2, item3, item4) = list
        println("$item1, $item2, $item3, $item4")
        // 只取前面三个元素
        var (v1, v2, v3) = list
        println("$v1, $v2, $v3")
    }
}